package cn.ydxiaoshuai.tools.factory;

import com.baidu.aip.error.AipError;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.http.AipRequest;
import com.baidu.aip.http.EBodyFormat;
import com.baidu.aip.imageprocess.AipImageProcess;
import com.baidu.aip.imageprocess.ImageProcessConsts;
import com.baidu.aip.util.Base64Util;
import com.baidu.aip.util.Util;
import org.json.JSONObject;

import java.io.IOException;
import java.util.HashMap;

/**
 * @author 小帅丶
 * @className AipMultiple
 * @Description 多个模块实现
 * @Date 2020/10/20-15:43
 **/
public class AipMultiple extends AipFace {
    static final String IMAGE_DEFINITION_ENHANCE = "https://aip.baidubce.com/rest/2.0/image-process/v1/image_definition_enhance";

    static final String IMAGE_QUALITY_ENHANCE = "https://aip.baidubce.com/rest/2.0/image-process/v1/image_quality_enhance";

    static final String DEHAZE = "https://aip.baidubce.com/rest/2.0/image-process/v1/dehaze";

    static final String CONTRAST_ENHANCE = "https://aip.baidubce.com/rest/2.0/image-process/v1/contrast_enhance";

    static final String COLOURIZE = "https://aip.baidubce.com/rest/2.0/image-process/v1/colourize";

    static final String STRETCH_RESTORE = "https://aip.baidubce.com/rest/2.0/image-process/v1/stretch_restore";

    public AipMultiple(String appId, String apiKey, String secretKey) {
        super(appId, apiKey, secretKey);
    }
    /**
     * 图像清晰度增强
     * 对压缩后的模糊图像实现智能快速去噪，优化图像纹理细节，使画面更加自然清晰
     *
     * @param image - 图像数据base64
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject imageDefinitionEnhance(String image) {
        AipRequest request = new AipRequest();
        preOperation(request);
        request.addBody("image", image);
        request.setUri(IMAGE_DEFINITION_ENHANCE);
        request.setBodyFormat(EBodyFormat.FORM_KV);
        postOperation(request);
        return requestServer(request);
    }
    /**
     * 图像清晰度增强
     * 对压缩后的模糊图像实现智能快速去噪，优化图像纹理细节，使画面更加自然清晰
     *
     * @param image - 二进制图像数据
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject imageDefinitionEnhance(byte[] image, HashMap<String, String> options) {
        AipRequest request = new AipRequest();
        preOperation(request);
        String base64Content = Base64Util.encode(image);
        request.addBody("image", base64Content);
        if (options != null) {
            request.addBody(options);
        }
        request.setUri(IMAGE_DEFINITION_ENHANCE);
        request.setBodyFormat(EBodyFormat.FORM_KV);
        postOperation(request);
        return requestServer(request);
    }
    /**
     * 图像无损放大接口
     * 输入一张图片，可以在尽量保持图像质量的条件下，将图像在长宽方向各放大两倍。
     *
     * @param image - 二进制图像数据
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject imageQualityEnhance(byte[] image, HashMap<String, String> options) {
        AipRequest request = new AipRequest();
        preOperation(request);

        String base64Content = Base64Util.encode(image);
        request.addBody("image", base64Content);
        if (options != null) {
            request.addBody(options);
        }
        request.setUri(IMAGE_QUALITY_ENHANCE);
        postOperation(request);
        return requestServer(request);
    }

    /**
     * 图像无损放大接口
     * 输入一张图片，可以在尽量保持图像质量的条件下，将图像在长宽方向各放大两倍。
     *
     * @param image - 本地图片路径
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject imageQualityEnhance(String image, HashMap<String, String> options) {
        try {
            byte[] data = Util.readFileByBytes(image);
            return imageQualityEnhance(data, options);
        } catch (IOException e) {
            e.printStackTrace();
            return AipError.IMAGE_READ_ERROR.toJsonResult();
        }
    }

    /**
     * 图像去雾接口
     * 对浓雾天气下拍摄，导致细节无法辨认的图像进行去雾处理，还原更清晰真实的图像。
     *
     * @param image - 二进制图像数据
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject dehaze(byte[] image, HashMap<String, String> options) {
        AipRequest request = new AipRequest();
        preOperation(request);
        String base64Content = Base64Util.encode(image);
        if (options != null) {
            request.addBody(options);
        }
        request.addBody("image", base64Content);
        request.setUri(DEHAZE);
        postOperation(request);
        return requestServer(request);
    }

    /**
     * 图像去雾接口
     * 对浓雾天气下拍摄，导致细节无法辨认的图像进行去雾处理，还原更清晰真实的图像。
     *
     * @param image - 本地图片路径
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject dehaze(String image, HashMap<String, String> options) {
        try {
            byte[] data = Util.readFileByBytes(image);
            return dehaze(data, options);
        } catch (IOException e) {
            e.printStackTrace();
            return AipError.IMAGE_READ_ERROR.toJsonResult();
        }
    }

    /**
     * 图像对比度增强接口
     * 调整过暗或者过亮图像的对比度，使图像更加鲜明。
     *
     * @param image - 二进制图像数据
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject contrastEnhance(byte[] image, HashMap<String, String> options) {
        AipRequest request = new AipRequest();
        preOperation(request);
        if (options != null) {
            request.addBody(options);
        }
        request.setUri(CONTRAST_ENHANCE);
        String base64Content = Base64Util.encode(image);
        request.addBody("image", base64Content);
        postOperation(request);
        return requestServer(request);
    }

    /**
     * 图像对比度增强接口
     * 调整过暗或者过亮图像的对比度，使图像更加鲜明。
     *
     * @param image - 本地图片路径
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject contrastEnhance(String image, HashMap<String, String> options) {
        try {
            byte[] data = Util.readFileByBytes(image);
            return contrastEnhance(data, options);
        } catch (IOException e) {
            e.printStackTrace();
            return AipError.IMAGE_READ_ERROR.toJsonResult();
        }
    }

    /**
     * 黑白图像上色接口
     * 智能识别黑白图像内容并填充色彩，使黑白图像变得鲜活。
     *
     * @param image - 二进制图像数据
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject colourize(byte[] image, HashMap<String, String> options) {
        AipRequest request = new AipRequest();
        preOperation(request);

        String base64Content = Base64Util.encode(image);
        request.addBody("image", base64Content);
        if (options != null) {
            request.addBody(options);
        }
        request.setUri(COLOURIZE);
        postOperation(request);
        return requestServer(request);
    }

    /**
     * 黑白图像上色接口
     * 智能识别黑白图像内容并填充色彩，使黑白图像变得鲜活。
     *
     * @param image - 本地图片路径
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject colourize(String image, HashMap<String, String> options) {
        try {
            byte[] data = Util.readFileByBytes(image);
            return colourize(data, options);
        } catch (IOException e) {
            e.printStackTrace();
            return AipError.IMAGE_READ_ERROR.toJsonResult();
        }
    }

    /**
     * 拉伸图像恢复接口
     * 自动识别过度拉伸的图像，将图像内容恢复成正常比例。
     *
     * @param image - 二进制图像数据
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject stretchRestore(byte[] image, HashMap<String, String> options) {
        AipRequest request = new AipRequest();
        preOperation(request);

        String base64Content = Base64Util.encode(image);
        request.addBody("image", base64Content);
        if (options != null) {
            request.addBody(options);
        }
        request.setUri(STRETCH_RESTORE);
        postOperation(request);
        return requestServer(request);
    }

    /**
     * 拉伸图像恢复接口
     * 自动识别过度拉伸的图像，将图像内容恢复成正常比例。
     *
     * @param image - 本地图片路径
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject stretchRestore(String image, HashMap<String, String> options) {
        try {
            byte[] data = Util.readFileByBytes(image);
            return stretchRestore(data, options);
        } catch (IOException e) {
            e.printStackTrace();
            return AipError.IMAGE_READ_ERROR.toJsonResult();
        }
    }

}
